package com.dylan.shot.common.util;

import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;

/**
 * Created by Dylan on 2017/9/6.
 *
 * 插入数据库时,获取自增id,字段名必须为id
 * 该接口必须在配置文件的mapper.mappers参数中声明,或者其子接口在mapper.mappers参数中声明,
 * 这是因为系统在启动时会根据这个配置动态生成SQL
 */
public interface InsertSelectiveUseGeneratedKeysMapper<T> {
    /**
     * 插入数据，限制为实体包含`id`属性并且必须为自增列，实体配置的主键策略无效
     *
     * @param record
     * @return
     */
    @Options(useGeneratedKeys = true, keyProperty = "id")
    @InsertProvider(type = InsertSelectiveUseGeneratedKeysProvider.class, method = "dynamicSQL")
    int insertSelectiveUseGeneratedKeys(T record);

    /**
     * ======如果主键不是id怎么用？==========
     * 方法一:
     * 假设主键的属性名是uid,那么新建一个Mapper接口如下
     * <pre>
         public interface InsertUidMapper<T> {
             @Options(useGeneratedKeys = true, keyProperty = "id")
             @InsertProvider(type = SpecialProvider.class, method = "dynamicSQL")
             int insertUseGeneratedKeys(T record);
         }
     * 只要修改keyProperty = "uid"就可以
     *
     * 然后让你自己的Mapper继承InsertUidListMapper<T>,并且在配置文件中的mapper.mappers参数增加该接口即可
     *
     * 方法二:
     * 仍然继承该接口,然后在自己的Mapper中重新定义该方法,修改keyProperty值,注意这是model中的属性名
     * 注意:
     *     1.keyProperty是model中的属性名
     *     2.自己的Mapper必须继承该接口,不能只在自己的Mapper中定义该方法,因为系统在启动时会自动生成动态SQL,
     *       如果不继承该接口则在系统启动时无法生成动态SQL
     * </pre>
     */
}
